package com.link.serve.tcp.encoder;// 解码器
import com.link.serve.tcp.message.Message;
import com.link.serve.tcp.message.proto.PackData;
import com.link.serve.tcp.message.proto.PackHeader;
import io.netty.buffer.ByteBuf;
import io.netty.channel.ChannelHandlerContext;
import io.netty.handler.codec.ByteToMessageDecoder;

import java.util.List;

public class MessageDecoder extends ByteToMessageDecoder {
    @Override
    protected void decode(ChannelHandlerContext ctx, ByteBuf in, List<Object> out) throws Exception {
        if (in.readableBytes() < 12) { // 检查是否有足够的数据用于解码（最小12字节：边界 + 版本 + 长度信息）
            return;
        }

        in.markReaderIndex(); // 标记当前读取位置，便于出错时回退

        int packetBoundary = in.readInt(); // 读取包边界
        if (packetBoundary != 0xabcd) { // 验证包边界是否合法
            throw new IllegalArgumentException("解码器识别失败，该传输数据格式不匹配本协议");
        }

        int version = in.readInt(); // 读取协议版本号
        int headerLength = in.readInt(); // 读取包头长度
        int bodyLength = in.readInt(); // 读取包体长度

        if (in.readableBytes() < headerLength + bodyLength) { // 检查是否有足够数据解析包头和包体
            in.resetReaderIndex(); // 数据不足时回退到标记位置
            return;
        }

        byte[] headerBytes = new byte[headerLength]; // 准备读取包头
        in.readBytes(headerBytes); // 读取包头数据
        PackHeader.Header header = PackHeader.Header.parseFrom(headerBytes); // 反序列化为 Header 对象

        byte[] bodyBytes = new byte[bodyLength]; // 准备读取包体
        in.readBytes(bodyBytes); // 读取包体数据
        PackData.Body body = PackData.Body.parseFrom(bodyBytes); // 反序列化为 Body 对象

        Message message = new Message(); // 构造协议对象
        message.setPacketBoundary(packetBoundary);
        message.setVersion(version);
        message.setPacketHeaderLength(headerLength);
        message.setPacketDataLength(bodyLength);
        message.setHeader(header);
        message.setBody(body);

        out.add(message); // 将解码后的对象传递给下一个处理器
    }
}